package br.uece.ativcomplementares.dao;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.uece.ativcomplementares.dto.DashBoardAlunoDTO;
import br.uece.ativcomplementares.dto.ListaDashboard;
import br.uece.ativcomplementares.entity.Aluno;
import br.uece.ativcomplementares.entity.AtividadeAluno;

public class AtividadeAlunoDao extends
		AbstractDao<AtividadeAluno> {

	private static final long serialVersionUID = 1L;
	
	@Override
	public void incluir(AtividadeAluno atividadeAluno) {
		atividadeAluno.setDataHoraCadastro(new Date());
		super.incluir(atividadeAluno);
	}

	public ListaDashboard listarAtividadesComplementaresComHoras(Aluno aluno) {
		StringBuilder hql = new StringBuilder();
		
		hql.append("select id, nome, ");
		hql.append("	   LEAST(SUM(horas_atividade_semestre), maximoHorasCurso) horas_computadas, ");
		hql.append("	   sum(total_horas_semestre) total_horas, ");		
		hql.append("	   maximoHorasPeriodo, maximoHorasCurso ");
		hql.append("from ( select tb2.id,  ");
		hql.append("	  		  tb2.descricao nome, ");
		hql.append("			  tb3.nome semestre, ");
		hql.append("			  LEAST(sum(horascursadas), COALESCE(tb2.maximohorasporsemestre, tb2.maximohorasporcurso)) horas_atividade_semestre, ");
		hql.append("			  sum(horascursadas) total_horas_semestre, ");
		hql.append("			  tb2.maximohorasporsemestre maximoHorasPeriodo, ");
		hql.append("			  tb2.maximohorasporcurso maximoHorasCurso ");
		hql.append("	   from atividadealuno as tb1 ");
		hql.append("	   join atividadecomplementar tb2 ");
		hql.append("	      on tb1.atividade_id = tb2.id ");
		hql.append("	   join periodo tb3 ");
		hql.append("		  on tb1.periodo_id = tb3.id ");
		hql.append("	   where tb1.aluno_id = :alunoId ");
		hql.append("	   group by tb2.id, tb2.descricao, tb3.nome, tb2.maximohorasporsemestre, tb2.maximohorasporcurso) tbs1 ");
		hql.append("group by id, nome, maximoHorasPeriodo, maximoHorasCurso   ");

		Query query = getEntityManager()
				.createNativeQuery(hql.toString());
		
		query.setParameter("alunoId", aluno.getId());
		
		ListaDashboard result = new ListaDashboard();
		
		for (Object row : query.getResultList()) {
			Object[] rowArray = (Object[]) row;
			
			result.addDto(
				new DashBoardAlunoDTO((BigInteger) rowArray[0], 
									  (String) rowArray[1], 
									  (BigDecimal) rowArray[2], 
									  (BigDecimal) rowArray[3],									  
									  (Integer) rowArray[4], 
									  (Integer) rowArray[5])
			);
		}
		
		return result;
	}
	
	public List<AtividadeAluno> listarAtividades(Aluno aluno, Long ativComplementarId) {
		StringBuilder hql = new StringBuilder();
		
		hql.append("select aa " );
		hql.append("from AtividadeAluno as aa ");
		hql.append("join fetch aa.periodo as p ");		
		hql.append("where aa.aluno.id = :alunoId ");
		hql.append("and aa.atividade.id = :ativComplementarId ");
		hql.append("order by p.nome desc");

		TypedQuery<AtividadeAluno> query = getEntityManager()
				.createQuery(hql.toString(), AtividadeAluno.class);
		
		query.setParameter("alunoId", aluno.getId());
		query.setParameter("ativComplementarId", ativComplementarId);	
		
		
		return query.getResultList();
	}

}
